/**
 * 使用jQuery 的 Ajax 通过 PHP API 获取数据
 *
 * @param obj
 * @param defaults
 */
function api_ajax_request_get_info(obj, defaults) {
    obj.each(function () {
        var thisElm = jQuery(this);

        //获得用于展示数据的模版
        var dataTpl = defaults.dataTpl; // 获得数据展示模版
        var lastestedData; // 最后插入到DOM中的模版元素
        var id, //唯一主键
            params;//其他参数

        //获得用于展示数据的模版元素
        if (dataTpl) {
            dataTpl = jQuery('#' + dataTpl);
            lastestedData = dataTpl;
        }

        // 组织合法的提交数据
        id = !defaults.id ? jQuery(thisElm).attr(defaults.loadIdFrom) : defaults.id;//获得唯一主键
        if (defaults.params != undefined) {
            params = api_json_to_query(defaults.params);//将json对象转化为 key1=value1&key2=value2的形式
        }
        if (id != false && id != undefined) {
            if (params != undefined) {
                params = 'id=' + id + '&' + params;
            }
            else {
                params = 'id=' + id;
            }

        }

        //如果没有设置为不实用参数，且又没有传递参数，报错
        //如果不使用限定参数，需要将noParam 设置为true
        if (defaults.noParam == false && params == undefined) {
            alert('请填写必要的限定参数（params和id都没有设置）');
            return;
        }

        // 显示 loading
        if (!dataTpl) { // 没有展示数据模版,直接用展示数据的元素来作为loading的容器
            // 设置了读取时的自定义字符则显示字符
            if (defaults.loadingStr != '') {
                jQuery(thisElm).html(defaults.loadingStr);
            }
            // 设置了读取时的自定义图片则显示图片，显示优先级高于字符
            if (defaults.loadingImg != '') {
                jQuery(thisElm).html('<img src="' + defaults.loadingImg + '" />');
            }
        }
        else { // 有展示数据模版，需要再设置一个loading的容器,在ajax请求的时候 展示loading，请求结束以后
            // 删除loading容器
            var loading = defaults.loading;
            if (loading) {
                loading = jQuery('#' + loading);
                loading.css('display', '');
            }
        }

        /*
         * 多个ajax请求使用异步请求 
         * 暂时不用
         if (window.__emall_ajax_processing == undefined)
         {
         window.__emall_ajax_processing = true;
         }
         else
         {
         defaults.async = false;
         }*/

        jQuery.ajax({
            type:defaults.type,
            url:defaults.url,
            data:params,
            async:defaults.async,
            success:function (msg) {
                var jsonObject = eval('(' + msg + ')');
                // 根据优先级覆盖使用不同方法覆盖值
                if (jsonObject && jsonObject.errors == undefined) {//没有错误信息,显示查询到的数据
                    var response_data, final_data;
                    if (jsonObject.data == undefined) {
                        response_data = jsonObject;
                    }
                    else {
                        response_data = jsonObject.data;
                    }
                    if (!dataTpl) {
                        jQuery(thisElm).removeAttr('data');
                        // 清空读取时显示的字符或者图片
                        if (defaults.loadingStr != '' || defaults.loadingImg) {
                            jQuery(thisElm).html('');
                        }
                        if (loading) {
                            loading.remove();
                        }

                        // 格式化字符串
                        if (!isNaN(defaults.format) && defaults.format > 0 & !isNaN(defaults.splitor) && defaults.splitor > 0) {
                            final_data = api_string_format(response_data, defaults.format, defaults.splitor);
                        }
                        else {
                            final_data = response_data;
                        }
                        // 前后添加指定字符串
                        final_data = defaults.beforeAdd + final_data + defaults.afterAdd;

                        if (defaults.writeToAttr || defaults.writeToAttrOnly) {
                            eval('jQuery(thisElm).attr("' + defaults.writeToAttr + '","' + final_data + '")');
                            if (defaults.writeToAttrOnly) {
                                return;
                            }

                        }
                        if (defaults.writeToCss != '' || defaults.writeToCssOnly != '') {
                            eval('jQuery(thisElm).css("' + defaults.writeToCss + '","' + final_data + '")');
                            if (defaults.writeToCssOnly) {
                                return;
                            }

                        }
                        eval('jQuery(thisElm).' + defaults.writeToFun + '("' + final_data + '")');
                    }
                    else { // 有展示数据的模版
                        jQuery.each(response_data,
                            function (index, data) {
                                var dataTplClone = dataTpl.clone().removeAttr('id');
                                var dataTplCloneContent = dataTplClone.html();
                                dataTplCloneContent = dataTplCloneContent.substitute(data);
                                dataTplClone.html(dataTplCloneContent);
                                lastestedData.after(dataTplClone);
                                lastestedData = dataTplClone;
                            });
                        dataTpl.remove(); // 删除模版

                        // 执行必要的格式化操作
                        jQuery('.emall_format', thisElm).each(function (index, item) {
                            item = jQuery(item);
                            var format_data = item.attr('data');
                            var ori_html = item.html();
                            var ori_val = ori_html;
                            var final_val;
                            var final_html;
                            if (format_data) {
                                format_data = eval('(' + format_data + ')');
                                format_data = jQuery.extend(defaults, format_data);
                            }
                            if (typeof format_data != 'object') {
                                return;
                            }
                            if (format_data.content != undefined) {
                                ori_val = format_data.content;
                            }
                            if (isNaN(ori_val) && format_data.format != 0 && format_data.splitor) {
                                final_val = api_string_format(ori_val, format_data.format, format_data.splitor);
                            }
                            else if (format_data.format) {
                                final_val = Number(ori_val).format(format_data.format);
                            }

                            final_val = format_data.beforeAdd + final_val + format_data.afterAdd;

                            if (format_data.writeToAttr || format_data.writeToAttrOnly) {
                                eval('jQuery(item).attr("' + format_data.writeToAttr + '","' + final_val + '")');
                                if (format_data.writeToAttrOnly) {
                                    item.empty();
                                    item.removeAttr('data');
                                    return;
                                }
                            }
                            if (format_data.writeToCss != '' || format_data.writeToCssOnly != '') {
                                eval('jQuery(item).css("' + format_data.writeToCss + '","' + final_val + '")');
                                if (format_data.writeToCssOnly != '') {
                                    item.empty();
                                    item.removeAttr('data');
                                    return;
                                }
                            }
                            var reg_quote_v = ori_val.reg_quote();
                            var reg = eval('/' + reg_quote_v + '/g');
                            final_html = ori_html.replace(reg, final_val);
                            item.html(final_html);
                            item.removeAttr('data');
                            item.removeClass('emall_format');
                        });
                    }
                }
                else {//有错误信息,显示错误信息
                    var final_msg = '<ul>';
                    jQuery.each(jsonObject.errors,
                        function (index, item) {
                            final_msg += '<li>' + item.msg + '</li>';
                        });
                    final_msg += '</ul>';
                    eval('jQuery(thisElm).' + defaults.writeToFun + '("' + final_msg + '")');
                }
            }
        });
    });
}